/*
 * Grupo: Dayana Souza Silva, Filipe Pires Guimaraes, Rafael Vieira Falcao
 * Mat.: 11211111, 113110873, 113111111
 */

package bolao.projeto.lp2;

import java.util.List;
import java.util.Map;
import java.util.TreeMap;

/**
 * Apostador do bolao
 * @author Dayana, Filipe, Rafael
 * @version 1.0
 */
public class Jogador {
	private String login, email, senha;
	private int pontuacao;
	private Map<Integer, Aposta> mapaDeApostas;
	private List<Jogador> listaDeAmigos;
	
	/**
	 * Construtor do jogador
	 */
	public Jogador() {
	}
	
	/**
	 * Construtor do jogador
	 * @param login Login do Jogador
	 * @param email Email do Jogador, para caso de esqueceu a senha
	 * @param senha Senha do Jogador, para autenticar o login
	 * @throws Exception Excecao de login, email e senha
	 */
	public Jogador(String login, String email, String senha) throws Exception{
		mudarLogin(login);
		mudarEmail(email);
		mudarSenha(senha);
		mapaDeApostas = new TreeMap<>();
	}
	
	/**
	 * mudara o login do Jogador
	 */
	public void mudarLogin(String login) throws Exception {
		if (login.isEmpty()) throw new Exception("login nao pode ser vazio.");
		this.login = login;
	}
	
	/**
	 * Retorna o login do Jogador
	 * @return Login do jogador
	 */
	public String getLogin() {
		return login;
	}
	
	/**
	 * mudara o email do jogador
	 * @param email 
	 * @throws Exception Email nao pode ser vazio
	 */
	public void mudarEmail(String email) throws Exception {
		if (email.isEmpty()) throw new Exception("Email nao pode ser vazio.");
		this.email = email;
	}
	
	/**
	 * Get do email do jogador
	 * @return Email do jogador
	 */
	public String getEmail() {
		return email;
	}

	/**
	 * mudara a senha do jogador
	 * @param senha Senha do jogador
	 * @throws Exception Senha nao pode ser vazio, e deve ser entre 4 e 8 caracteres
	 */
	public void mudarSenha(String senha) throws Exception {
		if (senha.isEmpty() || senha.length() < 4 || senha.length() > 8)
			throw new Exception("Senha nao pode ser vazia e deve ter entre 4 a 8 caracteres");
		this.senha = senha;
	}

	/**
	 * Get senha do Jogador
	 * @return Senha do jogador
	 */
	public String getSenha() {
		return senha;
	}

	/**
	 * Get pontuacao do jogador
	 * @return Pontuacao do jogador
	 */
	public int getPontuacao() {
		return pontuacao;
	}
	
	/**
	 * Adiciona mais de uma aposta do jogador
	 * @param listaNumJogos Lista dos jogos a serem apostados
	 * @param listaDeApostas Lista dos palpites das apostas para apostar
	 */
	public void aposta(List<Integer> listaNumJogos, List<Aposta> listaDeApostas) throws Exception {
		if(listaNumJogos.size() != listaDeApostas.size())
			throw new Exception("Numero de jogos para apostar diferente da quantidade de apostas.");
		if(listaNumJogos.size() > 64) throw new Exception ("Numero de jogos/apostas invalidos!");
		for(int i=0; i >= listaDeApostas.size(); i++)
			mapaDeApostas.put(listaNumJogos.get(i), listaDeApostas.get(i));
	}
	
	/**
	 * Adiciona um jogador a lista de amigos do Jogador
	 * @param jogador 
	 * @throws Exception
	 */
	public void adicionaAmigos(Jogador jogador) throws Exception {
			listaDeAmigos.add(jogador);
	}

	@Override
	public String toString() {
		return "Login: "+getLogin()+", e-mail: "+getEmail()+"\nPontos: "+getPontuacao();
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + email.hashCode();
		result = prime * result + login.hashCode();
		result = prime * result + pontuacao;
		result = prime * result + senha.hashCode();
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		
		if (!(obj instanceof Jogador))
			return false;
		Jogador other = (Jogador) obj;
		
		if (!email.equals(other.email))
			return false;
		if (!login.equals(other.login))
			return false;
		if (pontuacao != other.pontuacao)
			return false;
		if (!senha.equals(other.senha))
			return false;
		return true;
	}
}

